package com.ntd.study.base.thread;

import cn.hutool.core.lang.Console;
import ntd.util.UtilThread;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 线程池
 * 1.提供一个线程队列，里面保存着所有的等待状态的线程，避免了创建与销毁的额外开销，提高了响应速度。
 * 2.线程池体系结构
 * java.util.concurrent.Executor 负责线程的使用和调度的跟接口
 * |-- ThreadPoolExecutor 实现类 - 线程池
 * |-- ScheduledExecutor 子接口 - 负责线程的调度
 * |-- ScheduledThreadPoolExecutor - 继承 ThreadPoolExecutor，实现 ScheduledExecutor
 * 3.工具类 Excutors
 */
public class DemoThreadPool {
    public static void main(String[] args) {
        ExecutorService executorService = Executors.newFixedThreadPool(10);// 创建大小为10的线程池
        Executors.newCachedThreadPool(); // 缓存线程池，线程池数量不固定，可以根据需求自动的更改数量
        Executors.newSingleThreadExecutor(); // 创建单个线程池。线程池中只有一个线程
        ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10);// 创建固定大小的线程池，可以延迟或定时的执行任务。
        ThradPool thradPool = new ThradPool();

        // 给线程池分配任务
        for (int i = 0; i < 10; i++) {
            executorService.submit(thradPool);
        }
        // 关闭线程池
        executorService.shutdown();

        scheduledExecutorService.schedule(thradPool, 3, TimeUnit.SECONDS); // 延迟3秒执行
        scheduledExecutorService.shutdown();
    }

    static class ThradPool implements Runnable {
        private int i = 0;

        @Override
        public void run() {
            while (i <= 100) {
                UtilThread.sleep(100);
                Console.log(Thread.currentThread().getName() + ":" + i++);
            }
        }
    }
}


